struct _GtkCssValue {
GTK_CSS_VALUE_BASE
+ guint is_filter : 1; /* values stored in radius are std_dev, for drop-shadow */
guint n_shadows;
ShadowValue shadows[1];
};
static GtkCssValue * gtk_css_shadow_value_new (ShadowValue *shadows,
- guint n_shadows);
+ guint n_shadows,
+ gboolean is_filter);
static void
shadow_value_for_transition (ShadowValue *result,
shadows[i].inset = shadow->inset;
}
- return gtk_css_shadow_value_new (shadows, value->n_shadows);
+ return gtk_css_shadow_value_new (shadows, value->n_shadows, value->is_filter);
}
static gboolean
}
}
- return gtk_css_shadow_value_new (shadows, len);
+ return gtk_css_shadow_value_new (shadows, len, start->is_filter);
}
static void
gtk_css_value_shadow_print
};
-static GtkCssValue shadow_none_singleton = { >K_CSS_VALUE_SHADOW, 1, TRUE, 0 };
+static GtkCssValue shadow_none_singleton = { >K_CSS_VALUE_SHADOW, 1, TRUE, FALSE, 0 };
GtkCssValue *
gtk_css_shadow_value_new_none (void)
static GtkCssValue *
gtk_css_shadow_value_new (ShadowValue *shadows,
- guint n_shadows)
+ guint n_shadows,
+ gboolean is_filter)
{
GtkCssValue *retval;
guint i;
retval = _gtk_css_value_alloc (>K_CSS_VALUE_SHADOW, sizeof (GtkCssValue) + sizeof (ShadowValue) * (n_shadows - 1));
retval->n_shadows = n_shadows;
+ retval->is_filter = is_filter;
memcpy (retval->shadows, shadows, sizeof (ShadowValue) * n_shadows);
retval->is_computed = TRUE;
-
for (i = 0; i < n_shadows; i++)
{
const ShadowValue *shadow = &retval->shadows[i];
value.spread = _gtk_css_number_value_new (0, GTK_CSS_NUMBER);
value.color = _gtk_css_color_value_new_current_color ();
- return gtk_css_shadow_value_new (&value, 1);
+ return gtk_css_shadow_value_new (&value, 1, TRUE);
}
enum {
}
} while (gtk_css_parser_try_token (parser, GTK_CSS_TOKEN_COMMA));
- return gtk_css_shadow_value_new (shadows, n_shadows);
+ return gtk_css_shadow_value_new (shadows, n_shadows, FALSE);
fail:
for (i = 0; i < n_shadows; i++)
ShadowValue shadow;
if (gtk_css_shadow_value_parse_one (parser, FALSE, &shadow))
- return gtk_css_shadow_value_new (&shadow, 1);
+ return gtk_css_shadow_value_new (&shadow, 1, TRUE);
else
return NULL;
}
spread = _gtk_css_number_value_get (shadow->spread, 0);
radius = _gtk_css_number_value_get (shadow->radius, 0);
+ if (value->is_filter)
+ radius = radius * 2;
clip_radius = gsk_cairo_blur_compute_pixels (radius);
hoffset = _gtk_css_number_value_get (shadow->hoffset, 0);
voffset = _gtk_css_number_value_get (shadow->voffset, 0);
const GskRoundedRect *border_box)
{
guint i;
+ double dx, dy, spread, radius;
+ const GdkRGBA *color;
g_return_if_fail (value->class == >K_CSS_VALUE_SHADOW);
if (shadow->inset)
continue;
+ color = gtk_css_color_value_get_rgba (shadow->color);
+
/* We don't need to draw invisible shadows */
- if (gdk_rgba_is_clear (gtk_css_color_value_get_rgba (shadow->color)))
+ if (gdk_rgba_is_clear (color))
continue;
- gtk_snapshot_append_outset_shadow (snapshot,
- border_box,
- gtk_css_color_value_get_rgba (shadow->color),
- _gtk_css_number_value_get (shadow->hoffset, 0),
- _gtk_css_number_value_get (shadow->voffset, 0),
- _gtk_css_number_value_get (shadow->spread, 0),
- _gtk_css_number_value_get (shadow->radius, 0));
+ dx = _gtk_css_number_value_get (shadow->hoffset, 0);
+ dy = _gtk_css_number_value_get (shadow->voffset, 0);
+ spread = _gtk_css_number_value_get (shadow->spread, 0);
+ radius = _gtk_css_number_value_get (shadow->radius, 0);
+ if (value->is_filter)
+ radius = 2 * radius;
+
+ gtk_snapshot_append_outset_shadow (snapshot, border_box, color, dx, dy, spread, radius);
}
}
if (!shadow->inset)
continue;
+ color = gtk_css_color_value_get_rgba (shadow->color);
+
/* We don't need to draw invisible shadows */
- if (gdk_rgba_is_clear (gtk_css_color_value_get_rgba (shadow->color)))
+ if (gdk_rgba_is_clear (color))
continue;
dx = _gtk_css_number_value_get (shadow->hoffset, 0);
dy = _gtk_css_number_value_get (shadow->voffset, 0);
spread = _gtk_css_number_value_get (shadow->spread, 0);
radius = _gtk_css_number_value_get (shadow->radius, 0);
- color = gtk_css_color_value_get_rgba (shadow->color);
+ if (value->is_filter)
+ radius = 2 * radius;
/* These are trivial to do with a color node */
if (spread == 0 && radius == 0 &&
shadows[i].dy = _gtk_css_number_value_get (shadow->voffset, 0);
shadows[i].color = *gtk_css_color_value_get_rgba (shadow->color);
shadows[i].radius = _gtk_css_number_value_get (shadow->radius, 0);
+ if (value->is_filter)
+ shadows[i].radius *= 2;
}
gtk_snapshot_push_shadow (snapshot, shadows, value->n_shadows);